#ifndef ANIMATIONPARSEEXECONFIG_H
#define ANIMATIONPARSEEXECONFIG_H

#include <QTimer>

#include "DbHelper.h"
#include "animationState.h"
#include "animationController.h"
#include "instruction.h"
#include "step.h"

// 作为视频的话，可以解析每秒动画的内容，缓存起来，然后前端请求播放的时刻，后端返回状态……

// 解析用户配置的程序，并实现动画 (从头到尾运行一遍)
class AnimationParseExeConfig : QObject
{
    Q_OBJECT
public:
    AnimationParseExeConfig();

    bool startParsing(AnimationState* state, AnimationController* controller, int idx = 0);         // 开始播放动画，数据从数据库里面拿，idx是实验的编号

private:

    // 两步解析
    // 1. 将数据库中内容解析为指令
    QMultiMap<int, Instruction*> data2instruction(int idx);
    Instruction*   query2instruction(const QSqlQuery& query);
    // 2. 将指令解析为步骤
    QMultiMap<int, Step*> instruction2step(QMultiMap<int, Instruction*>);

    // 3. 执行步骤
    void execSteps();     // 开一个计时器（感觉放不放线程里也无所谓...反正controller是要放在线程开一个定时器，从创建开始就一直开着……）

    void execStep(Step* step);

private:

    QMultiMap<int, Step*> createDefaultSteps();

    bool isParsing = false;

    AnimationState*             _state;
    AnimationController*        _controller;
    QVector<QVector<QString>>   _dataList;
    QMap<int, Instruction*>      _instrunctionList;
    QMultiMap<int, Step*>       _stepList;
    int                         _maxFrame = 0;


};

#endif // ANIMATIONPARSEEXECONFIG_H
